<?php
namespace app\common\component;

use think\Model;
use think\facade\Db;
use think\facade\Lang;

// 组件基类
abstract class BaseComponent
{
    // 组件ID
    protected $id;
    
    // 页面ID
    protected $pageId;
    
    // 组件类型
    protected $type;
    
    // 组件名称（多语言标识）
    protected $name;
    
    // 组件配置
    protected $config = [];
    
    // 多语言内容
    protected $langValues = [];
    
    // 排序
    protected $sort = 0;
    
    // AI服务
    protected $aiService;
    
    // 配置字段定义
    protected $configFields = [];
    
    public function __construct($data = [])
    {
        // 初始化AI服务
        $this->aiService = new \app\common\service\AiService();
        
        // 加载数据
        if (!empty($data)) {
            $this->loadData($data);
        }
        
        // 控制器初始化
        $this->initialize();
    }
    public function initialize() {
        
    }
    
    // 加载组件数据
    public function loadData($data)
    {
        if (isset($data['id'])) $this->id = $data['id'];
        if (isset($data['page_id'])) $this->pageId = $data['page_id'];
        if (isset($data['sort'])) $this->sort = $data['sort'];
        
        // 解析配置
        if (isset($data['config']) && !empty($data['config'])) {
            $this->config = is_string($data['config']) ? json_decode($data['config'], true) : $data['config'];
        }
        
        // 加载语言数据
        $this->loadLangValues();
    }
    
    // 加载语言数据
    public function loadLangValues()
    {
        if (empty($this->id)) return;
        
        $lang = Lang::getLangSet();
        $langData = Db::name('component_lang')
                    ->where('component_id', $this->id)
                    ->where('lang', $lang)
                    ->find();
        
        if ($langData && !empty($langData['content'])) {
            $this->langValues = json_decode($langData['content'], true);
        }
    }
    
    // 获取配置
    public function getConfig($key = null, $default = null)
    {
        if ($key === null) {
            return $this->config;
        }
        
        return isset($this->config[$key]) ? $this->config[$key] : $default;
    }
    
    // 更新配置
    public function updateConfig($data = [])
    {
        $this->config = array_merge($this->config, $data);
        
        // 如果有ID，更新数据库
        if (!empty($this->id)) {
            Db::name('component')
              ->where('id', $this->id)
              ->update([
                  'config' => json_encode($this->config, JSON_UNESCAPED_UNICODE),
                  'update_time' => date('Y-m-d H:i:s')
              ]);
        }
        
        return $this;
    }
    
    // 获取语言值
    public function getLangValue($key, $default = '')
    {
        return isset($this->langValues[$key]) ? $this->langValues[$key] : $default;
    }
    
    // 获取所有语言值
    public function getLangValues()
    {
        return $this->langValues;
    }
    
    // 更新语言值
    public function updateLangValues($lang, $data = [])
    {
        $this->langValues = array_merge($this->langValues, $data);
        
        // 如果有ID，更新数据库
        if (!empty($this->id)) {
            $exists = Db::name('component_lang')
                       ->where('component_id', $this->id)
                       ->where('lang', $lang)
                       ->find();
                       
            $content = json_encode($this->langValues, JSON_UNESCAPED_UNICODE);
            
            if ($exists) {
                Db::name('component_lang')
                  ->where('id', $exists['id'])
                  ->update([
                      'content' => $content,
                      'update_time' => date('Y-m-d H:i:s')
                  ]);
            } else {
                Db::name('component_lang')->insert([
                    'component_id' => $this->id,
                    'lang' => $lang,
                    'content' => $content,
                    'create_time' => date('Y-m-d H:i:s'),
                    'update_time' => date('Y-m-d H:i:s')
                ]);
            }
        }
        
        return $this;
    }
    
    // 获取组件类型
    public function getType()
    {
        return $this->type;
    }
    
    // 获取组件名称
    public function getName()
    {
        return __($this->name);
    }
    
    // 获取配置字段定义
    public function getConfigFields()
    {
        return $this->configFields;
    }
    
    // 保存组件到数据库
    public function save()
    {
        $data = [
            'type' => $this->type,
            'page_id' => $this->pageId,
            'config' => json_encode($this->config, JSON_UNESCAPED_UNICODE),
            'sort' => $this->sort,
            'create_time' => date('Y-m-d H:i:s'),
            'update_time' => date('Y-m-d H:i:s')
        ];
        
        if (!empty($this->id)) {
            Db::name('component')->where('id', $this->id)->update($data);
        } else {
            $this->id = Db::name('component')->insertGetId($data);
        }
        
        return $this->id;
    }
    
    // 渲染组件
    abstract public function render();
    
    // AI生成内容
    abstract public function generateByAI($keywords = []);
}
